package org.posupe.empresas;

import org.posupe.util.RepositorioException;

/**
 * @author Marcio Calado
 */
public class CadastroEmpresas {
	private RepositorioEmpresas repositorio;

	public CadastroEmpresas(RepositorioEmpresas repositorio) {
		this.repositorio = repositorio;
	}

	public void atualizar(Empresa empresa) throws EmpresaInexistenteException, RepositorioException {
		repositorio.atualizar(empresa);
	}

	public void cadastrar(Empresa empresa) throws EmpresaJaCadastradaException, RepositorioException, CnpjInvalidoException {
		if (empresa.getCodigo() == null
				|| (empresa.getCodigo().trim().length() == 0) 
				|| !isCNPJValido(empresa.getCodigo())) {
			throw new CnpjInvalidoException(empresa.getCodigo());
		}
		if (empresa.getCodigo() != null
				&& repositorio.existe(empresa.getCodigo())) {
			throw new EmpresaJaCadastradaException(empresa);
		}
		repositorio.inserir(empresa);
	}

	public boolean existe(String cnpj) throws RepositorioException {
		return repositorio.existe(cnpj);
	}

	public IteratorEmpresas getEmpresas() throws RepositorioException {
		return repositorio.getIterator();
	}

	public Empresa procurar(String cnpj) throws EmpresaInexistenteException, RepositorioException {
		return repositorio.procurar(cnpj);
	}

	public IteratorEmpresas procurar(Empresa empresa) throws RepositorioException {
		return repositorio.procurar(empresa);
	}

	public void remover(String cnpj) throws EmpresaInexistenteException, RepositorioException {
		repositorio.remover(cnpj);
	}

	private boolean isCNPJValido(String cnpj) {
		int soma = 0;
		int dig;

		String cnpj_calc = cnpj.substring(0, 12);

		if (cnpj.length() != 14)
			return false;

		char[] chr_cnpj = cnpj.toCharArray();

		/* Primeira parte */
		for (int i = 0; i < 4; i++)
			if (chr_cnpj[i] - 48 >= 0 && chr_cnpj[i] - 48 <= 9)
				soma += (chr_cnpj[i] - 48) * (6 - (i + 1));
		for (int i = 0; i < 8; i++)
			if (chr_cnpj[i + 4] - 48 >= 0 && chr_cnpj[i + 4] - 48 <= 9)
				soma += (chr_cnpj[i + 4] - 48) * (10 - (i + 1));
		dig = 11 - (soma % 11);

		cnpj_calc += (dig == 10 || dig == 11) ? "0" : Integer.toString(dig);

		/* Segunda parte */
		soma = 0;
		for (int i = 0; i < 5; i++)
			if (chr_cnpj[i] - 48 >= 0 && chr_cnpj[i] - 48 <= 9)
				soma += (chr_cnpj[i] - 48) * (7 - (i + 1));
		for (int i = 0; i < 8; i++)
			if (chr_cnpj[i + 5] - 48 >= 0 && chr_cnpj[i + 5] - 48 <= 9)
				soma += (chr_cnpj[i + 5] - 48) * (10 - (i + 1));
		dig = 11 - (soma % 11);
		cnpj_calc += (dig == 10 || dig == 11) ? "0" : Integer.toString(dig);

		return cnpj.equals(cnpj_calc);
	}
}
